package com.boardgame.gwt.data;

import cloud.common.redis.redis.service.IRedisService;
import com.boardgame.gwt.data.card.*;
import com.boardgame.gwt.data.card.objective.BaseObjectiveCard;
import com.boardgame.gwt.data.space.GwtSpaceRailroad;
import com.boardgame.gwt.data.tile.GwtSpaceTile;
import com.boardgame.gwt.data.space.GwtSpace;
import com.boardgame.gwt.data.tile.worker.*;
import com.boardgame.gwt.entity.GwtGameDbInfo;
import com.boardgame.gwt.finalinfo.GameStage;
import com.boardgame.gwt.service.operate.SyntaxBaseAction;
import lombok.Data;

import java.util.*;

/**
 * 游戏信息
 */
@Data
public class GwtGameBoard extends GwtGameDbInfo {
    /**
     * 版图的空格
     */
    private List<GwtSpace> listSpace;

    /**
     * 工人市场
     */
    private List<GwtSpace> listSpaceWorker;

    /**
     * 进站-未来空格(6个)
     */
    private List<GwtSpace> listSpaceForesight;

    /**
     * 玩家列表
     */
    private List<GwtPlayerInfo> listPlayer;

    /**
     * 当前玩家顺序
     */
    private int playerIndex=0;
    /**
     * 游戏回合
     */
    private int gameRound=1;
    /**
     * 游戏阶段
     */
    private GameStage gameStage = GameStage.STAGE_MOVE;

    /**
     * 支持的命令列表
     */
    private List<SyntaxBaseAction> listActionSyntax;

    /**
     * 第一级的板块
     */
    private List<GwtSpaceTile> listTileFirst;
    /**
     * 第二级的板块
     */
    private List<GwtSpaceTileWorker> listTileSecond;
    /**
     * 第三级的板块
     */
    private List<GwtSpaceTile> listTileThird;
    /**
     * 人员市场
     */
    //private List<GwtSpaceTileWorker> listTileWorkerMarket;
    /**
     * 牛卡摸牌堆
     */
    private List<BaseCard> listCattleCardPile;

    /**
     * 牛卡市场
     */
    private List<BaseCard> listCattleCardMarket;

    /**
     * 目标卡摸牌堆
     */
    private List<BaseObjectiveCard> listCardObjectPile = new ArrayList<>();
    /**
     * 目标卡市场
     */
    private List<BaseObjectiveCard> listCardObjectMarket = new ArrayList<>();

    /**
     * 铁路格子
     */
    private List<GwtSpace> listRailroadSpace;

    /**
     * 获取位置
     * @param row
     * @param column
     * @return
     */
    public GwtSpace getGwtSplace(int row,int column){
        Optional<GwtSpace> optional = this.getListSpace().stream().
                filter(item -> item.getRow()==row && item.getColumn()==column ).findFirst();
        return optional.orElse(null);
    }

    /**
     * 获取操作玩家
     * @return
     */
    public GwtPlayerInfo getCurrentPlayer(){
        return this.getListPlayer().get(playerIndex);
    }

    /**
     * 设置下一位玩家
     */
    public void setNextPlayer(){
        this.playerIndex++;
        if (this.playerIndex==this.getPlayerNumber()){
            this.playerIndex=0;
            this.gameRound++;
        }
    }





    /**
     * 保存到redis
     */
    public GwtGameBoard saveToRedis(IRedisService redisService){
        redisService.setValue(this.getGameName(),this);
        return this;
    }

    /**
     * 从redis取出
     * @return
     */
    public GwtGameBoard getFromRedis(IRedisService redisService){
        GwtGameBoard gameBoard = (GwtGameBoard)redisService.getValue(this.getGameName(),false);
        return gameBoard;
    }
}
